home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / sbin / locale-gen < prev    next >
Text File  |  2009-10-14  |  6KB  |  238 lines

  1. #!/bin/sh
  2.  
  3. set -e
  4.  
  5. SUPPORTED=/var/lib/locales/supported.d
  6. LOCALES=/usr/share/i18n/locales
  7. STATEDIR=/var/lib/belocs
  8.  
  9. [ -n "$POSIXLY_CORRECT" ] && unset POSIXLY_CORRECT || true
  10.  
  11. IS_LANG=no
  12. ARCHIVE=no
  13. PURGE=no
  14. ALIASES=
  15.  
  16. #  Handle command-line options
  17. prev=
  18. while true
  19. do
  20.     option="$1"
  21.     if [ -n "$prev" ]; then
  22.                 eval "$prev=\$option"
  23.                 prev=
  24.                 continue
  25.     fi
  26.  
  27.     case $option in
  28.     -h|--help)
  29.         cat <<EOT
  30. Usage: locale-gen [OPTIONS]
  31. Options:
  32.  -h, --help         display this message and exit
  33.      --purge        remove existing locales before processing
  34.      --archive      store compiled locale data inside a single archive
  35.      --no-archive   do not store compiled locale data inside a single archive
  36.                     (default)
  37.      --aliases=FILE read locale aliases from FILE. (Default: /etc/locale.alias)
  38.      --lang         treat argument as generic language code
  39. EOT
  40.         exit 0
  41.         ;;
  42.     --purge)
  43.         PURGE=yes
  44.         ;;
  45.     --no-purge)
  46.         PURGE=no
  47.         ;;
  48.     --archive)
  49.         ARCHIVE=yes
  50.         ;;
  51.     --no-archive)
  52.         ARCHIVE=no
  53.         ;;
  54.     --keep-existing)
  55.         #  Cache in belocs-locales-bin makes this flag useless,
  56.         #  but it is provided so that belocs-locales-bin can be
  57.         #  installed on Ubuntu boxes.
  58.         ;;
  59.     --aliases)
  60.         prev=ALIASES
  61.         ;;
  62.     --aliases=*)
  63.         ALIASES=$(expr "x$option" : 'x[^=]*=\(.*\)')
  64.         ;;
  65.     --lang)
  66.         IS_LANG=yes
  67.         ;;
  68.     --*)
  69.         echo "locale-gen: invalid option -- $option"
  70.         echo "Try 'locale-gen --help' for more information."
  71.         exit 1
  72.         ;;
  73.     *)
  74.         break
  75.         ;;
  76.     esac
  77.  
  78.     shift
  79. done
  80.  
  81. mkdir -p "$SUPPORTED"
  82.  
  83. # determine the locales to be generated in $GENERATE
  84. GENERATE=
  85. if [ -z "$1" ]; then
  86.     [ -n "`ls $SUPPORTED`" ] || exit 0
  87.     GENERATE=`cat $SUPPORTED/*`
  88. fi
  89.  
  90. while [ -n "$1" ]; do
  91.     if [ -f "$SUPPORTED/$1" ]; then
  92.         GENERATE="$GENERATE\n`cat $SUPPORTED/$1`"
  93.     elif [ $IS_LANG = no ] && L=`grep "^$1 " /usr/share/i18n/SUPPORTED`; then
  94.         GENERATE="$GENERATE\n$L"
  95.         # add to supported.d/local if necessary
  96.         if [ ! -f "$SUPPORTED/local" ] || ! grep -q "^$L" "$SUPPORTED/local"; then
  97.             echo "$L" >> "$SUPPORTED/local"
  98.         fi
  99.     else
  100.         # try to come up with a sensible default
  101.         GENERATE=`grep -E "^${1}( |[._@][^[:space:]]* )UTF-8" /usr/share/i18n/SUPPORTED`
  102.         if [ -z "$GENERATE" ]; then
  103.             echo "Error: '$1' is not a supported language or locale" >&2
  104.             exit 1
  105.         fi
  106.         NL='
  107. '
  108.         IFS_SAVE="$IFS"
  109.         IFS="$NL"
  110.         for L in $GENERATE; do
  111.             IFS="$IFS_SAVE"
  112.             # add to supported.d/local if necessary
  113.             if [ ! -f "$SUPPORTED/local" ] || ! grep -q "^$L" "$SUPPORTED/local"; then
  114.                 echo "$L" >> "$SUPPORTED/local"
  115.             fi
  116.             IFS="$NL"
  117.         done
  118.         IFS="$IFS_SAVE"
  119.     fi
  120.     shift
  121. done
  122.  
  123. [ -d "$STATEDIR" ] || mkdir -p "$STATEDIR" || PURGE=yes
  124.  
  125. no_archive=
  126. [ "$ARCHIVE" = yes ] || no_archive="--no-archive"
  127. locale_alias=
  128. [ -n "$ALIASES" ] && [ -r "$ALIASES" ] && locale_alias="-A $ALIASES"
  129.  
  130. umask 022
  131.  
  132. is_entry_ok() {
  133.     if [ -n "$locale" ] && [ -n "$charset" ]
  134.     then
  135.         true
  136.     else
  137.         echo "Error: Bad entry '$locale $charset'" 1>&2
  138.         false
  139.     fi
  140. }
  141.  
  142. normalize_locale() {
  143.     #  Insert a leading x in case $1 begins with a dash
  144.     this_locale=x$1
  145.     charset=
  146.     if echo $this_locale | LC_ALL=C grep '\.' > /dev/null 2>&1; then
  147.         charset=$(echo $this_locale | sed -e 's/^x//' -e 's/.*\(\.[^@]*\).*/\1/' | LC_ALL=C tr '[A-Z]' '[a-z]' | LC_ALL=C sed -e 's/[^a-z0-9.]//g')
  148.     fi
  149.     modifier=
  150.     if echo $this_locale | LC_ALL=C grep '@' > /dev/null 2>&1; then
  151.         modifier=$(echo $this_locale | sed -e 's/^x//' -e 's/.*\(@[^.]*\).*/\1/')
  152.     fi
  153.     main=$(echo $this_locale | sed -e 's/^x//' -e 's/[.@].*//')
  154.     echo $main$charset$modifier
  155. }
  156.  
  157. gen_dep() {
  158.     [ -d "$STATEDIR" ] || return 1
  159.     #  Generate the dependency list.  It is needed by update_md5sum()
  160.     ( LC_ALL=C grep '^\(include\|copy\)' "$LOCALES"/* |\
  161.       sed -e "s,^$LOCALES/,," -e 's/\(include\|copy\)[     ]*"/ /' -e 's/".*//'
  162.     ) | LC_ALL=C sort -u > "$STATEDIR/locales.dep" 2>/dev/null
  163. }
  164.  
  165. gen_md5sum() {
  166.     [ -d "$STATEDIR" ] || return 1
  167.     #  If old md5sums are not present, regenerate all locales.
  168.     [ -f "$STATEDIR/hashfile" ] || return 1
  169.     mv -f "$STATEDIR/hashfile" "$STATEDIR/hashfile.old" || return 1
  170.  
  171.     md5sum "$LOCALES"/* > "$STATEDIR/hashfile.new" || return 1
  172.     locale -a > "$STATEDIR/list" 2>/dev/null || return 1
  173. }
  174.  
  175. #  Check whether a locale was already generated and all its dependencies
  176. #  have not been modified.
  177. already_generated() {
  178.     [ -f "$STATEDIR/locales.dep" ] || return 1
  179.     [ -f "$STATEDIR/hashfile.old" ] || return 1
  180.     [ -f "$STATEDIR/hashfile.new" ] || return 1
  181.     [ -f "$STATEDIR/list" ] || return 1
  182.     this_locale=$(normalize_locale $1)
  183.     this_input=$2
  184.     #  Check whether the locale is already present.
  185.     LC_ALL=C grep "^$this_locale\$" "$STATEDIR/list" > /dev/null 2>&1 || return 1
  186.     #  If yes, check if this file and its dependencies have changed
  187.     for file in "$this_input" $(LC_ALL=C grep "^$this_input:" "$STATEDIR/locales.dep" | awk '{printf "%s ", $2}')
  188.     do
  189.         md5old=$(LC_ALL=C grep "/$file\$" "$STATEDIR/hashfile.old" | sed -e 1q)
  190.         md5new=$(LC_ALL=C grep "/$file\$" "$STATEDIR/hashfile.new" | sed -e 1q)
  191.         [ -n "$md5old" ] || return 1
  192.         [ -n "$md5new" ] || return 1
  193.         [ "$md5new" = "$md5old" ] || return 1
  194.     done
  195.     return 0
  196. }
  197.  
  198. update_md5sum() {
  199.     [ -f "$STATEDIR/locales.dep" ] || return 0
  200.     this_locale=$1
  201.     for file in "$this_locale" $(LC_ALL=C grep "^$this_locale:" "$STATEDIR/locales.dep" | awk '{printf "%s ", $2}')
  202.     do
  203.         md5sum "$LOCALES/$file" >> "$STATEDIR/hashfile" || return 0
  204.     done
  205. }
  206.  
  207. gen_dep 2>/dev/null || true
  208. [ "$PURGE" = yes ] || gen_md5sum 2>/dev/null || PURGE=yes
  209. if [ "$PURGE" = yes ]; then
  210.     rm -f "$STATEDIR/hashfile.old" "$STATEDIR/hashfile.new" "$STATEDIR/list" 2>/dev/null || true
  211.     rm -rf /usr/lib/locale/* 2>/dev/null || true
  212. fi
  213.  
  214. echo "Generating locales..."
  215. /bin/echo -e "$GENERATE" | sort -u | while read locale charset
  216. do
  217.     case $locale in
  218.         \#*) continue;;
  219.         "") continue;;
  220.     esac
  221.     is_entry_ok || continue
  222.     #  Remove charset if present
  223.     input=$(echo $locale | sed -e 's/\.[^@]*//')
  224.     #  Insert charset before modifier
  225.     printf "%s" $input | sed -e "s/^\\([^@]*\\)\\(.*\\)/  \\1.${charset}\\2... /"
  226.     if already_generated $locale $input; then
  227.         echo 'up-to-date'
  228.     else
  229.         if localedef $no_archive -i $input -c -f $charset $locale_alias $locale; then    
  230.             echo 'done'
  231.         else
  232.             echo 'failed'
  233.         fi
  234.     fi
  235.     update_md5sum $input 2>/dev/null
  236. done
  237. echo "Generation complete."
  238.